perm filename DUMP.1[AID,LSP] blob sn#451946 filedate 1979-06-21 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00002 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	(declare (fasload util fas dsk (aid rpg)))
C00008 ENDMK
C⊗;
(declare (fasload util fas dsk (aid rpg)))
(declare (mapex t) 
	 (special to-dump-junk to-dump-file dump-printer))

(setq to-dump-junk () to-dump-file () dump-printer 'print)

(macrodef macro-name (x)
 (cond ((atom (cadr x))(cadr x))
       (t (caadr x))))

(defun load-file fexpr (file)
 (apply 'eread file)
 (setq to-dump-file file)
 (select-disk-input
  (read-until-eof with form do
   (cond ((atom form)(eval form))
	 ((memq (car form) '(macro macrodef))
	  (push (cons 'macro (macro-name form)) to-dump-junk) 
	  (eval form))
	 ((eq (cadr form) 'macro)
	  (push (cons 'macro (caddr form)) to-dump-junk)
	  (eval form))
	 ((eq (caddr form) 'macro)
	  (push (cons 'macro (cadr form)) to-dump-junk)
	  (eval form))
	 ((eq (car form) 'require)
	  (terpri)(princ '|Don't handle REQUIREs yet.|)(terpri))
	 ((eq (car form) 'defun)
	  (cond ((eq (caddr form) 'fexpr)
		 (push (cons 'defun-fexpr (cadr form)) to-dump-junk))
		((atom (caddr form))
		 (push (cons 'defun-lexpr (cadr form)) to-dump-junk))
		(t (push (cons 'defun-expr (cadr form)) to-dump-junk))) 
	  (eval form))
	 ((eq (car form) 'setq)
	  (let f ← (cdr form) do
	       (while f do
		      (push (cons 'variable (car f)) to-dump-junk)
		      (set (car f) (eval (cadr f)))
		      (setq f (cddr f)))))
	 (t (eval form)))) 
  file))

(defun dump ()
 (uwrite)
 (let to-dump-junk ← (reverse to-dump-junk) do
 (unselect-tty
   (select-disk-output
    (for item ε to-dump-junk do
	 (selectq (car item)
		  (variable
		   (funcall dump-printer `(setq ,(cdr item) ',(symeval (cdr item)))))
		  (defun-expr
		   (funcall dump-printer 
		    `(defun ,(cdr item) .
			    ,(dump-make-expr (get (cdr item) 'expr)))))
		  (defun-fexpr
		   (funcall dump-printer `(defun ,(cdr item) fexpr .
				     ,(dump-make-expr (get (cdr item) 'fexpr)))))
		  (defun-lexpr
		   (funcall dump-printer `(defun ,(cdr item) .
				     ,(dump-make-expr (get (cdr item) 'expr)))))
		  (macro
		   (funcall dump-printer `(defun ,(cdr item) .
				     ,(dump-make-expr (get (cdr item) 'macro)))))
		  ())))))
 (setq to-dump-junk ())
 (cond ((probef (namelist to-dump-file))
	(deletef (namelist to-dump-file))))
 (apply 'ufile (namelist to-dump-file))  
 to-dump-file)

(defun dump-make-expr (x)
 `(,(cadr x) . ,(cddr x)))

(macrodef type (x)
(let prop ← () do
     (cond ((setq prop (get x 'expr))
	    (cond ((atom (cadr  prop))
		   'lexpr)
		  (t 'expr)))
	   ((get x 'fexpr)
	    'fexpr)
	   ((get x 'macro)
	    'macro)
	   (t 'variable)))) 

(defun to-dump fexpr (items)
 (for item ε items do
      (selectq (type item)
	       (expr
		(push (cons 'defun-expr item) to-dump-junk))
	       (fexpr
		(push (cons 'defun-fexpr item) to-dump-junk))
	       (lexpr
		(push (cons 'defun-lexpr item) to-dump-junk))
	       (variable
		(push (cons 'variable item) to-dump-junk))
	       (macro
		(push (cons 'defun-macro item) to-dump-junk))
	       ())))

(sstatus ttyint 453. 'dump-handler)
(sstatus ttyint 485. 'dump-handler)

(defun dump-handler (x y)(print (dump))(terpri))

(defun refilev fexpr (x)
 (funcall 'to-dump (cond ((atom (car x))(ncons (car x)))
			 (t (car x))))
 (setq to-dump-file (cadr x))
 (dump))